"""
用户中心日志演示 - 基于Linus设计哲学
"日志应该为用户服务，而不是为开发者服务"

这个示例展示了如何使用新的用户中心日志系统，
所有日志都从用户视角描述问题和影响。
"""

import asyncio
import time
from gua import GuaApp, JSON, Stream, SSE, get_default_logger, set_default_logger
from gua.logger import GuaLogger

# 创建用户中心的日志配置
user_logger = GuaLogger("user_centric_demo", output="console")
set_default_logger(user_logger)

app = GuaApp()


@app.route("/")
async def index():
    """主页 - 展示用户中心日志的重要性"""
    return """
    <html>
    <head>
        <title>用户中心日志演示</title>
        <style>
            body { font-family: Arial, sans-serif; margin: 40px; }
            .demo-section { margin: 20px 0; padding: 20px; border: 1px solid #ddd; }
            .error { color: red; }
            .success { color: green; }
            .warning { color: orange; }
        </style>
    </head>
    <body>
        <h1>🎯 用户中心日志演示</h1>
        
        <div class="demo-section">
            <h2>📋 测试端点</h2>
            <ul>
                <li><a href="/api/users">/api/users</a> - 正常API调用</li>
                <li><a href="/api/error">/api/error</a> - 触发错误（查看用户影响日志）</li>
                <li><a href="/api/stream">/api/stream</a> - 流式响应测试</li>
                <li><a href="/api/sse">/api/sse</a> - SSE事件流测试</li>
                <li><a href="/api/encoding-error">/api/encoding-error</a> - 编码错误测试</li>
            </ul>
        </div>
        
        <div class="demo-section">
            <h2>🎯 用户中心日志特性</h2>
            <ul>
                <li class="success">✅ 所有日志都包含用户影响说明</li>
                <li class="success">✅ 错误日志提供用户可理解的信息</li>
                <li class="success">✅ 调试日志帮助诊断用户问题</li>
                <li class="success">✅ 警告日志说明对用户的潜在影响</li>
            </ul>
        </div>
        
        <div class="demo-section">
            <h2>📊 查看日志</h2>
            <p>打开浏览器开发者工具的控制台或查看服务器控制台输出，
            所有日志都以用户为中心编写，说明每个事件对用户的影响。</p>
        </div>
    </body>
    </html>
    """


@app.route("/api/users")
async def get_users():
    """正常API调用 - 展示成功日志"""
    logger = get_default_logger()
    logger.info(
        "api_users_request",
        message="用户请求用户列表",
        endpoint="/api/users",
        user_impact="用户将看到用户列表数据"
    )
    
    return JSON({
        "users": [
            {"id": 1, "name": "张三", "email": "zhangsan@example.com"},
            {"id": 2, "name": "李四", "email": "lisi@example.com"}
        ],
        "total": 2
    })


@app.route("/api/error")
async def trigger_error():
    """触发错误 - 展示用户中心错误日志"""
    logger = get_default_logger()
    logger.info(
        "api_error_request",
        message="用户请求错误测试端点",
        endpoint="/api/error",
        user_impact="将触发错误处理流程，用户看到错误页面"
    )
    
    # 故意触发错误来展示用户中心日志
    from gua.exceptions import GuaException
    raise GuaException(
        "这是一个演示错误，用于展示用户中心日志",
        status_code=500,
        user_impact="用户将看到友好的错误页面，而不是技术细节"
    )


@app.route("/api/stream")
async def stream_demo():
    """流式响应演示"""
    logger = get_default_logger()
    logger.info(
        "api_stream_request",
        message="用户请求流式数据",
        endpoint="/api/stream",
        user_impact="用户将看到实时流式数据更新"
    )
    
    async def generate_data():
        for i in range(10):
            logger.debug(
                "stream_data_generated",
                message=f"生成流式数据块 {i+1}/10",
                chunk_index=i+1,
                total_chunks=10,
                user_impact="用户将逐步看到数据加载"
            )
            yield f"数据块 {i+1}: {time.strftime('%H:%M:%S')}\n"
            await asyncio.sleep(0.5)
        
        logger.info(
            "stream_completed",
            message="流式数据传输完成",
            total_chunks=10,
            user_impact="用户已看到完整的数据流"
        )
    
    return Stream(generate_data())


@app.route("/api/sse")
async def sse_demo():
    """SSE事件流演示"""
    logger = get_default_logger()
    logger.info(
        "api_sse_request",
        message="用户请求SSE事件流",
        endpoint="/api/sse",
        user_impact="用户将建立实时事件连接"
    )
    
    async def generate_events():
        for i in range(5):
            logger.debug(
                "sse_event_generated",
                message=f"生成SSE事件 {i+1}/5",
                event_index=i+1,
                total_events=5,
                user_impact="用户将收到实时事件通知"
            )
            yield {
                "event": "update",
                "data": {"message": f"实时更新 {i+1}", "time": time.strftime('%H:%M:%S')}
            }
            await asyncio.sleep(1)
        
        logger.info(
            "sse_completed",
            message="SSE事件流完成",
            total_events=5,
            user_impact="用户已收到所有实时事件"
        )
    
    return SSE(generate_events())


@app.route("/api/encoding-error")
async def encoding_error_demo():
    """编码错误演示 - 展示编码问题的用户中心日志"""
    logger = get_default_logger()
    logger.info(
        "api_encoding_error_request",
        message="用户请求编码测试端点",
        endpoint="/api/encoding-error",
        user_impact="将触发编码错误处理，展示用户中心错误日志"
    )
    
    # 返回包含特殊字符的数据，可能触发编码问题
    problematic_data = {
        "message": "包含特殊字符的测试数据: \x00\x01\x02",
        "unicode": "测试中文和emoji: 🚀 🔥 💯",
        "binary": b"binary_data_with_null\x00_byte"
    }
    
    return JSON(problematic_data)


if __name__ == "__main__":
    import subprocess
    import sys
    
    # 使用gua命令显示示例启动信息
    result = subprocess.run([sys.executable, "-m", "gua.cli", "examples.user_centric_logging_demo:app", "--example-info"],
                          capture_output=True, text=True)
    if result.returncode == 0:
        print(result.stdout)
    else:
        print("错误: 无法显示启动信息")
        print("请手动运行: gua examples.user_centric_logging_demo:app --example-info")